其他
Cortex‐M3的Faults异常究竟是什么?
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | strongerHuang
有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情况。
1Cortex‐M3异常
说起Fault,我们就要说一下Cortex‐M3的异常。
CM3部分异常列表:
向量表
2Fault错误异常
在Cortex‐M3中的Fault这种错误异常有:
BusFault总线错误
MemManageFault存储器管理错误
UsageFault用法错误
HardFault硬错误
取指,通常被称作“预取流产”(prefetch abort) 数据读/写,通常被称作“数据流产”(data abort)
中断处理起始阶段的堆栈 PUSH 动作。称为“入栈错误” 中断处理收尾阶段的堆栈 POP 动作。称为“出栈错误” 在处理器启动中断处理序列(sequence)后的向量读取时。这是一种罕见的特殊情况,被归类为硬错误。
企图访问无效的存储器 region。常见于访问的地址没有相对应的存储器。 设备还没有作好传送数据的准备。比如,在尚未初始化 SDRAM 控制器的时候试图访问 SDRAM。 在企图启动一次数据传送时,传送的尺寸不能为目标设备所支持。例如,某设备只接受字型数据,却试图送给它字节型数据。 因为某些原因,设备不能接受数据传送。例如,某些设备只有在特权级下才允许访问,可当前却是用户级。
访问了 MPU 设置区域覆盖范围之外的地址 往只读 region 写数据 用户级下访问了只允许在特权级下访问的地址
执行了未定义的指令 执行了协处理器指令(Cortex‐M3 不支持协处理器,但是可以通过 fault 异常机制来使用软件模拟协处理器的功能,从而可以方便地在其它 Cortex 处理器间移植) 尝试进入 ARM 状态(因为 CM3 不支持 ARM 状态,所以用法 fault 会在切换时产生。软件可以利用此机制来测试某处理器是否支持 ARM 状态) 无效的中断返回(LR 中包含了无效/错误的值) 使用多重加载/存储指令时,地址没有对齐。另外,通过设置 NVIC 的对应控制位,可以在下列场合下也产生用法 fault: 除数为零 任何未对齐的访问
4.HardFault硬错误
状态寄存器(HFSR):
3如何应对Fault错误异常
在软件开发过程中,我们可以根据各种 fault错误 状态寄存器的值来判定程序错误,并且改正它们。下面给出了各种 faults 的常见诱因,以及应对攻略。
MemManage fault 状态寄存器提供的讯息:
总线 fault 状态寄存器提供的讯息:
用法 fault 状态寄存器提供的讯息:
硬 fault 状态寄存器提供的讯息:
后台回复『STM32』『Cortex‐M3』阅读更多相关文章。
欢迎关注我的公众号,回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
点击“阅读原文”查看更多分享。